package com.pubinfo.passbook.common.service.ruler;

import com.pubinfo.passbook.common.entity.TPassbook;
import com.pubinfo.passbook.common.entity.TSourceArtificial;
import com.pubinfo.passbook.common.model.bo.witeoff.CityInfo;
import com.pubinfo.passbook.common.model.dto.witeoff.MedicineOnJobOrRetireDTO;
import com.pubinfo.passbook.common.model.http.eip.UserInfo;
import com.pubinfo.passbook.common.model.ruler.Details;
import com.pubinfo.passbook.common.model.ruler.PayInformation;
import com.pubinfo.passbook.common.model.ruler.PersonInformation;
import com.pubinfo.passbook.common.model.ruler.UserAcc;
import org.dom4j.DocumentException;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface CheckService {
  //检查票据单一性
  Boolean checkPassbookType(List<String> idList);
  
  BigDecimal countWriteoff(MedicineOnJobOrRetireDTO jobDTO, Boolean isFront);

  Boolean isShengGongSi(List<TPassbook> passbookList);
  //上传的票据人员校验
  Boolean checkPassbookPayer(List<String> idList, String acctId) throws DocumentException;
  BigDecimal getStartPayments(Map<String, Object> paramEnv, List<PayInformation> payInformations);
  /**
   * @param payInformations 票据详细列表
   * @param acctId          当前登录的用户
   * @param passbookId      指定报销用户的账户
   *                        当前登录用户是否有权限报销指定用户
   */
  Boolean checkUserPower(List<PayInformation> payInformations, String acctId, String passbookId);
  
  /**
   * 根据地区及身份证号,查询是否为该地区认可的特殊病种
   *
   * @param districtName
   * @param idNo
   * @return
   */
  Boolean isSpecialDiseases(String districtName, String idNo);
  
  /**
   * @param districtName
   * @param idNo
   * @return
   */
  Boolean isSpecialUser(String districtName, String idNo);
  
  Boolean isSpecialUser(String districtName, String idNo, String roleCode);
  
  //获取所有票据中该人员的票据
  List<PayInformation> getUserPassbookIdList(List<PayInformation> payInformations, PersonInformation personInformation);
  
  //获取所有票据中该人员供属的票据
  List<PayInformation> getGenusPassbookIdList(List<PayInformation> payInformations, PersonInformation personInformation);
  
  //验证所有票据是否属于想要报销的一个人
  Boolean checkPassbookUser(List<PayInformation> payInformations, PersonInformation personInformation);
  
  String getStaffCode(String idNo, Boolean isGenus);
  
  Boolean judgeRole(String roleCode, UserInfo userInfo);
  
  //检查用户是否有权限报销
  Boolean checkUserPermission(List<String> invoiceIds, String acctId) throws DocumentException;
  
  Boolean checkUserPermission(String acctId, List<String> invoiceIds, String passbookAccId) throws DocumentException;
  
  /**
   * @param acct       当前登录用户账号,有可能是报销员
   * @param acctCertNo 供属人员身份证号
   * @param invoiceIds 票据列表
   * @return
   * @throws DocumentException
   */
  Boolean checkUserPermission(String acct, String acctCertNo, List<String> invoiceIds) throws DocumentException;
  
  /**
   * 当前时间是否为年度报账时间
   *
   * @param type 1代表1月1日到12月31日  ,2 代表7月1日到次年6月30日
   * @return
   */
  Boolean isFannualDate(Integer type);
  
  BigDecimal checkPassbookSum(MedicineOnJobOrRetireDTO jobDTO);
  
  /**
   * 校验当前报销金额是否达到配置的年度最大金额.返回可报销金额 ,单据专用.
   *
   * @param info
   * @param artificialList
   * @return
   */
  BigDecimal checkArtificialSum(CityInfo info, List<TSourceArtificial> artificialList);
  
  Boolean isReimbursementDate(String nsrsbh, String type, String idNo);
  
  /**
   * 当前时间是否为季度报账时间
   *
   * @return
   */
  Boolean isQuarterDate();
  
  /**
   * 按规则对票据进行分组
   *
   * @param invoiceInfos
   * @return
   */
  Map<String, List<TPassbook>> group(List<String> invoiceInfos);
  
  /**
   * 计算票据|发票总金额
   *
   * @param invoiceIds
   * @return
   */
  BigDecimal sumAll(List<String> invoiceIds);
  
  /*判断所有发票类型是不是和前端传入的类型相同*/
  Boolean checkTypeIsNeed(Byte reimbursementType, List<String> idList);
  
  /*
  统计诊察费自费+检查费自费+化验费自费+卫生材料费自费+中成药费自费+中药饮片费自费+西药费自费总数。
   */
  BigDecimal sumAmountSelf(List<Details> detailsList);
  
  /**
   * 获取总自费.
   *
   * @param passbookIds
   * @return
   */
  BigDecimal sumAllTotalAmount(List<String> passbookIds);
  
  BigDecimal sumAllTotalAmountByPayInformations(List<PayInformation> passbookIds);
  
  //查询所有自费项目的总金额
  BigDecimal sumAllownPayAmount(List<PayInformation> payInformations);
  
  //查询所有自理项目的总金额
  BigDecimal sumAllSelfpaymentCare(List<PayInformation> payInformations);
  
  //根据员工账号，查询报账组织编码 报账人姓名 报账人账号
  UserAcc getUserAcc(String account, Boolean isShow);

  /**
   * 判断是否含有竖版票据
   * @param invoiceIds
   * @return
   */
  Boolean haveVerticalPlate(List<String> invoiceIds);

  /**
   * 判断票据中是否有不可报销的项目
   * @param invoiceIds
   * @return
   */
  Boolean haveNonReimbursableItem(List<String> invoiceIds);


  /**
   * 判断金额列表是否有错误
   * @param payInformations
   * @return
   */
  Boolean haveWrongAmount(List<PayInformation> payInformations);
}
